SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
/*
	REALIZA UNA NUEVA LIQUIDACION EN FUNCION DE UN PERIODO Y UN TIPO DE BECA
*/

CREATE PROCEDURE [dbo].[spNuevaLiquidacionBYP] 
@periodo varchar(7), -- Siempre hay que recibirlo en formato mm/aaaa (no m/aa ó mm/aa ó m/aaaa)
@beca int   -- ID de la Beca a la que se hace la nueva liquidacion
AS

--Transformamos el periodo en formato fecha para poder comparar. Nos interesa solo el mes y el año.
declare @FechaPeriodo datetime
select @FechaPeriodo = cast('01/'+@periodo as datetime)

declare @mesPeriodo int
declare @annoPeriodo int
select @mesPeriodo = cast(left(@periodo, 2) as int)
select @annoPeriodo = cast(right(@periodo, 4) as int)

--En esta variable se encuentra el ID del nuevo periodo a liquidar
declare @IDPeriodo int

--Variables para obtener los valores del cursor Becas
declare @idBeca int
declare @MontoMensual float
declare @FechaVencimiento datetime

--Se verifica que el periodo no este liquidado para el tipo de beca que se quiere liquidar.Si existe se devuelve "-1"
if exists (Select * from  tb_PeriodosDeLiquidacionBYP, tb_MovimientosLiquidacionBYP where 
	tb_PeriodosDeLiquidacionBYP.Descripcion = @periodo and tb_MovimientosLiquidacionBYP.Periodo = idPeriodoLiquidacion and
	tb_MovimientosLiquidacionBYP.BecaOPrestamo = @beca) begin
	return(-1) end
else begin
--En caso de no existir, primero se inserta el nuevo periodo.
	if not exists(Select * from tb_PeriodosDeLiquidacionBYP where descripcion = @periodo) begin
		insert into tb_PeriodosDeLiquidacionBYP (descripcion) values (@periodo)
		select @IDPeriodo = @@IDENTITY end
	else
		select @IDPeriodo = (Select idPeriodoLiquidacion from tb_PeriodosDeLiquidacionBYP where descripcion = @periodo)
	
--Luego se procesa la liquidacion dando el alta en los movimientos y actualizando los montos de la beca.
	
	declare @mes varchar(3)
	declare @ano varchar(4)
	declare @res varchar(7)

	declare Becas cursor  for 
	Select idBeca, MontoMensual, FechaVencimiento from tb_BecasYPrestamos where Tipo = @beca and MontoLiquidado < MontoTotal 

	open Becas		fetch next from Becas into @idBeca, @MontoMensual, @FechaVencimiento
	while @@fetch_status = 0 begin

		Select @mes = '0'+cast(month(@FechaVencimiento) as varchar(2))
		if (len(@mes) > 2)
		Select @mes = right(@mes,len(@mes)-1)
		Select @ano = cast(year(@FechaVencimiento) as varchar(4))
		Select @res = @mes+'/'+@ano	

		--Controlamos que no se liquide una beca cuya Fecha de Vencimiento haya expirado.
		if (month(@FechaVencimiento) <= @mesPeriodo) and (year(@FechaVencimiento) >= @annoPeriodo) or
		  (month(@FechaVencimiento) >= @mesPeriodo) and (year(@FechaVencimiento) >= @annoPeriodo) begin

			print 'Se da de alta el movimiento de liquidacion'			

			--Por cada entrada válida del cursor Beca se inserta el movimiento correspondiente.
			 insert into tb_MovimientosLiquidacionBYP (BecaOPrestamo, Periodo, Monto, Fecha)
			values (@idBeca, @IDPeriodo, @MontoMensual, getdate())

			--Se actualiza el monto liquidado para cada una de las becas liquidadas.
			update tb_BecasYPrestamos
			set MontoLiquidado = MontoLiquidado + @MontoMensual
			where idBeca = @idBeca

		end

		fetch next from Becas into @idBeca, @MontoMensual, @FechaVencimiento
	
	end --FIN WHILE
	
	close Becas
	deallocate Becas
	-- Retorna el id del periodo generado para que pueda ser listado en el ASP al momento que se hace el alta.
	return(@IDPeriodo)
end	



GO
